﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace PixelDetectSDKInterface
{
	public enum ImageFileFormat : int
	{
		_FG_FILE_BMP = 0,
		_FG_FILE_JPEG = 1,
		_FG_FILE_JPEG2K = 2,
		_FG_FILE_PNG = 3,
		_FG_FILE_GIF = 4,
	}

	// 图像检测特征数据结构
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGImageDetectStdData
	{
		public int structSize;
		
		[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
		public char[] name;
	
		[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
		public char[] version;
		
		[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
		public char[] date;
		
		[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
		public char[] reserved;                 // reserved

		public int ijpg;                            // file format
		public int sz1, sz2;                        // file size
		public int bits1, bits2;                    // image bits
		public int dpi;                         // DPI
		public int igr1, igr2;                      // imgGrayRange
		public float iag1, iag2;                    // imgAverageGrayscale
		public float ff1, ff2;                      // faceFrontal
		public float fe1, fe2;                      // faceExposure
		public float fu1, fu2;                      // faceUniform
		public float fx1, fy1, fv1;             // fg a, b, l
		public float fx2, fy2, fv2;
		public float fh1, fh2;                      // faceHotspots
		public float fb1, fb2;                      // faceBlur
		public float eo1, eo2;                      // eyesOpen
		public float eg1, eg2;                      // eyesGlasses
		public float ef1, ef2;                      // eyesFrontal
		public float fo1, fo2;                      // faceOffset中心偏移
		public float ed1, ed2;                      // eyesDistance

		public int bktype;                         // 0: Monochromel; 1: Complex;
		public float bu1, bu2;                     // bgUniform
		public float bx1, by1, bv1;                // bk a, b, l
		public float bx2, by2, bv2;

		public int nFaceType;                       //正面、侧面、其它
		public int bKeepRatio;                      //允许等比例缩放
		public int fWidth;                          // width, height
		public int fHeight;
		public int fEyesDisMin;                 //两眼距离
		public int fEyesDisMax;
		public int fFaceWidthMin;                   //脸宽（耳朵内侧）
		public int fFaceWidthMax;
		public int fHeadWidthMin;                   //头宽（耳朵外侧）
		public int fHeadWidthMax;
		public int fEyesYMin;                       //眼睛Y位置
		public int fEyesYMax;
		public int fHeadHeightMin;                  //头高（头顶到下巴）
		public int fHeadHeightMax;
		public int fHeadTopYMin;                    //头顶
		public int fHeadTopYMax;

		// 严重不合格范围(颜色)
		public float dfx1, dfy1, dfv1;
		public float dfx2, dfy2, dfv2;
		public float dbx1, dby1, dbv1;
		public float dbx2, dby2, dbv2;

		public float lowcs1, lowcs2;                //灰蒙
		public float ffroll1, ffroll2;              //脸旋转
		public float ffyaw1, ffyaw2;                //脸侧转
		public float fhpitch1, fhpitch2;            //头俯昂
		public float gf1, gf2;                      //眼镜架框
		public float gc1, gc2;                      //眼镜片颜色深浅
		public float gflash1, gflash2;              //镜片反光
		public float ec1, ec2;                      //眼睛被遮挡
		public float ered1, ered2;                  //红眼
		public float fexp1, fexp2;                  //表情自然
		public float mc1, mc2;                      //嘴巴闭合
		public float noise1, noise2;                //图像噪声
		public float psss1, psss2;                  //PS:磨皮
		public float psos1, psos2;                  //PS:过度锐化
	};

	//图像品质评价结构定义
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGDetectAssess
	{
		public short pass;                        // 综合品质是否合格

		public short file_corrupt;                // 文件已损坏
		public short file_format;                // 文件格式不符
		public short file_size;                  // 文件大小不符
		public short img_WidHei;                 // 图像高宽不符
		public short img_bits;                   // 色彩位数不符
		public short img_DPI;                    // DPI不符
		public short img_borders;             // 相片有边框
		public short gray_range;                  // 灰度范围
		public short average_gray;                // 平均灰度
		public short lowcs;                       // 整体发灰
		public short img_noise;                   // 图像噪声

		public short bk_uniform;                  // 背景不均匀
		public short bk_colorL;                   // 严重偏暗(-2) 偏暗(-1) 正常(0) 偏亮(1) 严重偏亮(2)     
		public short bk_colorA;                   // 严重偏绿(-2) 偏绿(-1) 正常(0) 偏红(1) 严重偏红(2)   
		public short bk_colorB;                   // 严重偏蓝(-2) 偏蓝(-1) 正常(0) 偏黄(1) 严重偏黄(2)
		public short color_cloth_similar;     // 服饰与背景色接近

		public short eye_distance;                // 两眼距离不合要求
		public short eyeYCood;                   // 眼睛Y坐标
		public short face_offsetX;                // 头水平方向偏移
		public short face_offsetY;                // 头竖直方向偏移
		public short head_top;                   // 头顶距离

		public short glasses;                 // 戴眼镜
		public short glass_frame;             // 眼镜框宽/色深
		public short glass_cover;             // 眼镜片颜色太深
		public short glass_flash;             // 眼镜反光
		public short glass_covereye;              // 眼镜框遮挡眼睛
		public short hair_covereye;               // 头发遮住眼睛
		public short eye_covered;             // 眼睛被遮挡

		public short eyes_open;                   // 眼睛睁开
		public short red_eye;                 // 红眼
		public short mouth_close;             // 嘴巴闭合
		public short face_colorL;             // 严重偏暗(-2) 偏暗(-1) 正常(0) 偏亮(1) 严重偏亮(2)    
		public short face_colorA;             // 严重偏绿(-2) 偏绿(-1) 正常(0) 偏红(1) 严重偏红(2)
		public short face_colorB;             // 严重偏蓝(-2) 偏蓝(-1) 正常(0) 偏黄(1) 严重偏黄(2)
		public short face_roll;                   // 脸旋转 -1：脸逆时针转，1：脸顺时针转，0没转
		public short face_yaw;                    // 脸侧转 -1：脸向左侧转，1：脸向右侧转，0没转
		public short head_pitch;                  // 头俯昂 -1：头向下俯, 1：头向上昂，0:不俯昂
		public short face_blur;                  // 脸部模糊
		public short underexposure;               // 曝光不足
		public short overexposure;                // 曝光过度
		public short high_light;                  // 脸部高光
		public short light_uniform;               // 脸部曝光均匀性（光照不均匀）
		public short expression;                  // 表情
		public short face_frontal;                // 正脸（姿态不正）
		public short eyes_frontal;                // 正眼：眼睛朝前看（目光未视镜头）
		public short head_height;             //(-1,0,1) 偏小，通过，偏大
		public short face_width;                  // 脸宽
		public short head_width;                 // 头宽
		public short skin_smoothed;               // 磨皮效果
		public short over_sharpened;              // 过度锐化
		public short shoulder_tilt;               // 高低肩 (-)右肩高 (+)左肩高
		public short face_occlusion;              // 脸部遮挡 0 正常， 1 遮挡
	};

	//图像品质评价策略
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGDetectAssessProfile
	{
		public short file_corrupt;                // 文件数据损坏
		public short file_format;                // 文件格式不符
		public short file_size;                  // 文件大小不符
		public short img_WidHei;                 // 图像高宽不符
		public short img_bits;                   // 色彩位数不符
		public short img_DPI;                    // DPI不符
		public short img_borders;             // 相片有边框
		public short gray_range;                  // 灰度范围
		public short average_gray;                // 平均灰度
		public short lowcs;                       // 整体发灰
		public short img_noise;                   // 图像噪声

		public short bk_uniform;                  // 背景不均匀
		public short bk_color;                    // 背景颜色不合要求
		public short color_cloth_similar;     // 服饰与背景色接近

		public short eye_distance;                // 两眼距离不合要求
		public short eyeYCood;                   // 眼睛Y坐标
		public short face_offsetX;                // 头水平方向偏移
		public short face_offsetY;                // 头竖直方向偏移
		public short head_height;             // 头高
		public short head_width;                 // 头宽
		public short face_width;                  // 脸宽
		public short head_top;                   // 头顶距离

		public short glasses;                 // 是否戴眼镜
		public short glass_frame;             // 眼镜框宽/色深
		public short glass_cover;             // 眼镜片颜色太深
		public short glass_flash;             // 眼镜反光
		public short glass_covereye;              // 眼镜框遮挡眼睛
		public short hair_covereye;               // 头发遮住眼睛

		public short eyes_open;                   // 眼睛睁开
		public short red_eye;                 // 红眼
		public short eyes_frontal;                // 正眼：眼睛朝前看（目光未视镜头）
		public short mouth_close;             // 嘴巴闭合
		public short skin_colorun;                // 肤色检测
		public short face_blur;                   // 脸部模糊（图像模糊）
		public short underexposure;               // 曝光不足
		public short overexposure;                // 曝光过度
		public short high_light;                  // 脸部高光
		public short light_uniform;               // 脸部曝光均匀性（光照不均匀）
		public short expression;                  // 表情不自然
		public short face_frontal;                // 正脸（姿态不正）
		public short skin_smoothed;               // 磨皮效果
		public short over_sharpened;              // 过度锐化
		public short shoulder_tilt;               // 高低肩
		public short face_occlusion;              // 脸部遮挡
	};

	// 图像属性
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGPhotoAttribute
	{
		public int format;                 // 文件格式
		public int size;                   // 文件大小
		public int width, height;          // 图像宽度、高度（像素）
		public int bit;                    // 图像色彩位数
		public int pitch;                  // 图像数据行字节数
		public int dpi;                    // 输出DPI（像素/英寸） 
		public int borders;                // 图像损坏类型
		public int gray_range;             // 灰度动态范围 [0,255]
		public float average_light;            // 平均亮度 [0,255]
		public float low_contrast;         // 整体灰蒙(低对比度)[0,1]
		public float noise;                    // 图像噪声
	};

	// 人像位置属性
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGFaceLocationAttribute
	{
		public int head_width;                 // 头宽
		public int head_height;                // 头高
		public int face_width;                 // 脸宽
		public int head_top;                   // 头顶
		public int face_left;                  // 人脸左边缘位置
		public int face_right;                 // 人脸右边缘位置
		public int head_left;                  // 人头左边缘位置
		public int head_right;                 // 人头右边缘位置
		public int eye_leftX;                  // 左眼位置
		public int eye_leftY;                  // 左眼位置
		public int eye_rightX;                 // 右眼位置
		public int eye_rightY;                 // 右眼位置
		public int chin_pos;                   // 下巴位置
		public int eye_distance;               // 两眼距离
		public int eye_top;                    // 眼睛距离上边沿
		public float face_offsetX;               // 居中偏移量(百分比),(-) 偏左 (+) 偏右
		public float face_offsetY;             // 水平垂直(百分比) (-) 偏上 (+) 偏下
		public float shoulder_tilt;                // 高低肩 (-)右肩高 (+)左肩高
	};

	// 脸部属性 
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGFaceAttribute
	{		
		public float roll;         // 脸旋转角度
		public float yaw;          // 脸侧转角度
		public float pitch;            // 头俯昂角度
		public float exposure;     // 脸部曝光
		public float light_uniform;    // 脸部光线均匀性
		public float colorL;
		public float colorA;
		public float colorB;           // 脸部平均色彩 LAB模式
		public float highlight;        // 脸部高光
		public float blur;         // 脸部模糊度
		public float eyes_open;        // 眼睛开闭
		public float eye_covered;  // 眼睛被遮挡
		public float eyes_red;     // 红眼
		public float eyes_frontal;   // 正视镜头
		public float mouth_close;  // 嘴巴开闭
		public float skin_smoothed;  // 脸部磨皮
		public float over_sharpened; // 过度锐化
		public float face_occlusion; // 脸部遮挡
	};

	// 背景属性
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGBackgroundAttribute
	{
		public float uniform;                  // 背景均匀性(0,1)
		public float colorL;
		public float colorA;
		public float colorB;                     // 纯色背景的颜色 LAB模式
		public float color_cloth_similar;        // 背景和衣服相似度
	};

	// 配件属性
	[StructLayout(LayoutKind.Sequential)]
	public struct _FGAccessoryAttribute
	{
		public float glasses;              // 戴眼镜
		public float glass_frame;          // 眼镜架框
		public float glass_cover;          // 眼镜片颜色深浅
		public float glass_flash;          // 眼镜反光
	};
}
